// package cn.itcast.redisdemo.utils;
//
//
// import cn.hutool.json.JSONObject;
// import cn.hutool.json.JSONUtil;
// import com.mongodb.BasicDBObject;
// import com.mongodb.DBObject;
// import com.mongodb.client.result.UpdateResult;
// import org.springframework.data.mongodb.core.MongoTemplate;
// import org.springframework.data.mongodb.core.query.*;
// import org.springframework.stereotype.Component;
// import org.springframework.util.Assert;
// import org.springframework.util.CollectionUtils;
//
// import javax.annotation.Resource;
// import java.io.Serializable;
// import java.lang.reflect.Field;
// import java.util.Collection;
// import java.util.List;
// import java.util.Map;
//
//
// /**
//  * https://blog.csdn.net/weixin_40986713/article/details/124192456
//  */
// @Component
// public class MongoDBUtil {
//
//     private  final Query EMPTY_QUERY = new BasicQuery("{}");
//    
//     @Resource
//     private  MongoTemplate template;
//
//
//     private  Query idEqQuery(Serializable id) {
//         Criteria criteria = Criteria.where("id").is(id);
//         return Query.query(criteria);
//     }
//
//     private  Query idInQuery(Collection<? extends Serializable> idList) {
//         Criteria criteria = Criteria.where("id").in(idList);
//         return Query.query(criteria);
//     }
//
//     private  Query eqQuery(Map<String, Object> data) {
//         if (CollectionUtils.isEmpty(data)) {
//             return EMPTY_QUERY;
//         } else {
//             Criteria criteria = new Criteria();
//             data.forEach((k, v) -> criteria.and(k).is(v));
//             return Query.query(criteria);
//         }
//     }
//
//     private  <T> Serializable getIdValue(T entity) {
//         try {
//             Field field = entity.getClass().getDeclaredField("id");
//             field.setAccessible(true);
//             return (Serializable) field.get(entity);
//         } catch (NoSuchFieldException | IllegalAccessException e) {
//             e.printStackTrace();
//         }
//         return null;
//     }
//
//     private  <T> Update getUpdate(T entity) {
//         Field[] fields = entity.getClass().getDeclaredFields();
//         for (Field field : fields) {
//             field.setAccessible(true);
//             try {
//                 System.out.println(field.getName()+" "+field.get(entity));
//             } catch (IllegalAccessException e) {
//                 e.printStackTrace();
//             }
//         }
//         return null;
//     }
//
//     public  <T> void save(T entity) {
//         template.save(entity);
//     }
//     public  <T> void saveOrUpdate(T entity) {
//         Assert.notNull(entity, "entity must not be null!");
//         String key = JSONUtil.toJsonStr(entity);
//         Update inc = new Update().inc(key, 1);
//         template.upsert(idEqQuery(getIdValue(entity)), inc, entity.getClass());
//     }
//
//     public  <T> void saveOrUpdateBatch(Collection<T> entityList) {
//         entityList.forEach(this::saveOrUpdate);
//     }
//     public  <T> void saveBatch(Collection<T> entityList) {
//         template.insertAll(entityList);
//     }
//
//     public  void removeById(Serializable id, Class<?> clazz) {
//         template.remove(idEqQuery(id), clazz);
//     }
//
//     public  void removeByMap(Map<String, Object> columnMap, Class<?> clazz) {
//         template.remove(eqQuery(columnMap), clazz);
//     }
//
//     public  void removeByIds(Collection<? extends Serializable> idList, Class<?> clazz) {
//         template.remove(idInQuery(idList), clazz);
//     }
//
//     public  void remove(Query query, Class<?> clazz) {
//         template.remove(query, clazz);
//     }
//
//     public  <T> boolean updateById(T entity) {
//         Assert.notNull(entity, "entity must not be null!");
//         JSONObject obj = JSONUtil.toBean(entity.toString(),JSONObject.class);
//         DBObject update = new BasicDBObject();
//         update.put("$set", obj);
//         UpdateResult result = template.updateFirst(idEqQuery(getIdValue(entity)), new BasicUpdate(update.toString()), entity.getClass());
//         return result.getModifiedCount() == 1L;
//     }
//
//     public  <T> void updateBatchById(Collection<T> entityList) {
//         entityList.forEach(e -> updateById(e));
//     }
//
//     public  void update(Query query, Update update, Class<?> clazz) {
//         template.updateMulti(query, update, clazz);
//     }
//
//
//
//     public  <T> T getById(Serializable id, Class<T> clazz) {
//         return template.findById(id, clazz);
//     }
//
//     public  <T> T getOne(Query query, Class<T> clazz) {
//         return template.findOne(query, clazz);
//     }
//
//     public  <T> List<T> listByIds(Collection<? extends Serializable> idList, Class<T> clazz) {
//         return template.find(idInQuery(idList), clazz);
//     }
//
//     public  <T> List<T> listByMap(Map<String, Object> columnMap, Class<T> clazz) {
//         return template.find(eqQuery(columnMap), clazz);
//     }
//
//     public  <T> List<T> list(Class<T> clazz) {
//         return template.findAll(clazz);
//     }
//
//     public  <T> List<T> list(Query query, Class<T> clazz) {
//         return template.find(query, clazz);
//     }
//
//     public  <T> long count(Class<T> clazz) {
//         return template.count(EMPTY_QUERY, clazz);
//     }
//
//     public  <T> long count(Query query, Class<T> clazz) {
//         return template.count(query, clazz);
//     }
//
//     // public  <T> IPage<T> page(IPage page, Class<T> clazz) {
//     //     page.setTotal(count(clazz));
//     //     Pageable pageable = PageRequest.of((int) (page.getCurrent()+1), (int) page.getSize());
//     //     List<T> records = template.find(new Query().with(new Sort(Sort.Direction.DESC, "id")).with(pageable), clazz);
//     //     page.setPages(page.getPages());
//     //     page.setRecords(records);
//     //     return page;
//     // }
//     //
//     // public  <T> IPage<T> page(IPage page, Query query, Class<T> clazz) {
//     //     page.setTotal(count(query, clazz));
//     //     Pageable pageable = PageRequest.of((int) (page.getCurrent()+1), (int) page.getSize());
//     //     List<T> records = template.find(query.with(pageable), clazz);
//     //     page.setPages(page.getPages());
//     //     page.setRecords(records);
//     //     return page;
//     // }
//
// }
